package com.spring.demo2.eg2;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;

/**
 * 在BeanFactory后置处理阶段，spring容器已经完成了所有bean的注册，这个阶段中你可以对BeanFactory中的一
 * 些信息进行修改，比如修改阶段1中一些bean的定义信息，修改BeanFactory的一些配置等等，此阶段
 * spring也提供了一个接口来进行扩展： BeanFactoryPostProcessor ，接口中有个方法postProcessBeanFactory，
 * spring会获取容器中所有BeanFactoryPostProcessor类型的bean，然后调用他们的 postProcessBeanFactory
 * <br>
 * BeanFactoryPostProcessor的重要实现类：
 * 1.PropertySourcesPlaceholderConfigurer
 * 其方法 postProcessBeanFactory 可以来处理xml中属性中的${xxx}，会对这种格式的进行解析处理为真正的值
 * 2.CustomScopeConfigurer
 * 向容器中注册自定义的Scope对象，即注册自定义的作用域实现类。用法就是定义一个 CustomScopeConfigurer 的bean，然后通过这个类来注册自定义的bean
 * 3.EventListenerMethodProcessor
 * 处理 @EventListener 注解
 *
 * @author vhans
 */
@Component
public class MyBeanFactoryProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("进行修改LessonModel的bean信息");
        BeanDefinition lessonModel = configurableListableBeanFactory.getBeanDefinition("lessonModel");
        lessonModel.getPropertyValues().add("name", "spring高手课程");
    }
}
